package Shifu.MainServer.Management;

import java.util.List;
import java.util.ArrayList;
import java.io.Serializable;
import java.util.Iterator;

/**
* @class Classe che descrive un file  dopo lo split
* @authors vr069316
*/

public class FileChunkedDescriptor implements Serializable {
	
		/* campi */
	
		/* nome del file */
		private String filename;
	
		/* dimensione del file */
		private long dim_file;
	
		/* hash md5 del file */
		private String hash;
	
		/* numero di chunk creati */
		private int num_chunk;
		
		/*  lista di tutti i chunk del file */
		private List elenco_chunk;
		
	
	
		/**
		 *Istanzia un nuovo oggetto FilechunkDescriptor	
		 *@param nome del file
		 *@param dimensione del file
		 *@param l'hash del file
		 *@param la lista di tutti i chunk che compongono il file
		 */

		public FileChunkedDescriptor(String filename,long dim_file,String hash,int num_chunk,List elenco_chunk) {
			
			this.filename = filename;
			this.dim_file = dim_file;
			this.hash = hash;
			this.num_chunk = num_chunk;
			this.elenco_chunk = elenco_chunk;
		}
	
		/* metodi */
			
		 /**
		  *Restituisce il nome del file
		  *@return filename, nome del file
	   	  */	

		public String getFileName() {
				return this.filename;
		}
		
		/**
		 *Restituisce la dimensione  del file
		 *@return dim_file, dimensione del file
	   	 */
	
		public long getDim_file() {
				return this.dim_file;
		}
		
		/**
		 *Restituisce l'md5 del file
		 *@return md5, md5 del file
	   	 */	

		public String getHash() {
				return this.hash;
		}
		
		/**
		 *Restituisce il numero di chunk del file
		 *@return num_chunk, nome del file
	   	 */	
		
		public int getNum_chunk() {
			     return this.num_chunk;
		}
		
		/**
		 *Restituisce lo stack con tutti i chunk del file
		 *@return elenco_chunk, elenco dei chunk
	   	 */	
		
		public List getElenco_chunk() {
			    return this.elenco_chunk;
		}
		
		/**
		 *Setta il numero dei chunk
		 *@param  n, numero dei chunk
	   	 */	
		public void setNum_chunk(int n) {
				this.num_chunk = n;
		}
		
		/**
		 *Setta l'elenco dei chunk
		 *@param s, Stack dei chunk
	   	 */	

		public void setElenco_chunk(List s) {
				this.elenco_chunk = s;
		}

		/**
		 *Stamapa il contenuto dell'oggetto
		 *@return contenuto dell'oggetto
		 */

		public String toString() {
			return "FileDescriptor :: "+this.filename+"| size : "+this.dim_file+"| num chunk : "+this.num_chunk+"| hash : "+this.hash+" |";
		}	


		/**
		 *Ritorna l'i-esimo chunkdescriptor
		 *@return il chunkDescriptor
		 */

		public ChunkDescriptor getChunk(int i) {
		 	return (ChunkDescriptor) elenco_chunk.get(i);
		}


		/**
		 *Rimuove un determinato Peer dalla lista del file	
		 *@param peer il peer da rimuovere
		 */

		public void removePeerFile(Peer peer) {

			Iterator it = elenco_chunk.iterator();

			//Scansiona tutti i chunkDescriptor e va ad eliminare il Peer richiesto
			while(it.hasNext()) {
				ChunkDescriptor val = (ChunkDescriptor) it.next();
				if (!val.thereIsPeer(peer))
					System.out.println("Il chunk non è presente!");
				val.removePeerChunk(peer);
			}
		}
	
}
